package com.globefrog.framework.log;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import lombok.Getter;
import lombok.Setter;

/**
 * 自定义追踪日志. 所有的Appender都继承UnsynchronizedAppenderBase,由当前类去实现自定义
 *
 * @author caijinbang
 * @date 2020-11-07 23:12
 */
@Getter
@Setter
public class TraceLogAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {

  /**
   * 日志路径.
   */
  private String logFolder;

  /**
   * 输出格式布局.
   */
  private PatternLayout layout;


  public TraceLogAppender() {

  }

  /**
   * 开始执行前的初始化处理.
   */
  @Override
  public void start() {
    //traceLog初始化,主要是初始化,比如写入数据库 或者redis时 初始化连接等等
    TraceLogger traceLogger = TraceLogger.getInstance();
    traceLogger.setLogFolder(this.logFolder);
    traceLogger.setLayout(this.layout);
    super.start();
  }

  /**
   * 执行结束的处理.
   */
  @Override
  public void stop() {
    // 移除日志处理,主要是释放相关资源，如数据库连接，redis线程池等等
    TraceLogger.getInstance().clearAll();
    super.stop();
  }

  /**
   * 追加自定义输出.
   *
   * @param event 日志事件
   */
  @Override
  protected void append(ILoggingEvent event) {
    try {
      // 自定义实现输出
      TraceLogger.getInstance().process(event);
    } catch (Exception e) {
      addError("failed to wirte log", e);
    }
  }
}
